package br.ucb.ProjetoFinal.validators;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

/**
 * source : www.javabeat.net
 */
public class ValidatorCnpj implements Validator{

    public void validate(FacesContext facesContext, UIComponent arg1, Object value) throws ValidatorException {

        String cod = (String) value;
        Pattern mascara = Pattern.compile("[0-9]{2}.[0-9]{3}.[0-9]{3}/[0-9]{4}-[0-9]{2}");
        Matcher match = mascara.matcher(cod);

        //Se um codigo tiver sido digitado
        if(!cod.equals("")){
            if (!match.matches()){
                FacesMessage message = new FacesMessage();
                message.setSummary("CNPJ - CNPJ inválido. Ele deve estar no formato 'xx.xxx.xxx/xxxx-xx'");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);                
            }
            //Se estiver no formato certo
            else{
                //.replaceall("\\D","") retira todos os caracteres que não são números da String
                if(!validaCNPJ(cod.replaceAll("\\D", ""))){
                    FacesMessage message = new FacesMessage();
                    message.setSummary("CNPJ - CNPJ inválido. Este CNPJ não existe.");
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                    throw new ValidatorException(message);                    
                }
            }
        }
    }



    /** Metodo para a validação do CNPJ.
    *
    * @param   str_cnpj número de CNPJ a ser validado
    * @return  true se o CNPJ é válido e false se não é válido
    */
    static public boolean validaCNPJ( String str_cnpj ){  
       int soma = 0, aux, dig;  
       String cnpj_calc = str_cnpj.substring(0,12);  
  
       if ( str_cnpj.length() != 14 )  
         return false;  
  
       char[] chr_cnpj = str_cnpj.toCharArray();  
  
       /* Primeira parte */  
       for( int i = 0; i < 4; i++ )  
         if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )  
           soma += (chr_cnpj[i] - 48 ) * (6 - (i + 1)) ;  
       for( int i = 0; i < 8; i++ )  
         if ( chr_cnpj[i+4]-48 >=0 && chr_cnpj[i+4]-48 <=9 )  
           soma += (chr_cnpj[i+4] - 48 ) * (10 - (i + 1)) ;  
       dig = 11 - (soma % 11);  
  
       cnpj_calc += ( dig == 10 || dig == 11 ) ?  
                      "0" : Integer.toString(dig);  
  
       /* Segunda parte */  
       soma = 0;  
       for ( int i = 0; i < 5; i++ )  
         if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )  
           soma += (chr_cnpj[i] - 48 ) * (7 - (i + 1)) ;  
       for ( int i = 0; i < 8; i++ )  
         if ( chr_cnpj[i+5]-48 >=0 && chr_cnpj[i+5]-48 <=9 )  
           soma += (chr_cnpj[i+5] - 48 ) * (10 - (i + 1)) ;  
       dig = 11 - (soma % 11);  
       cnpj_calc += ( dig == 10 || dig == 11 ) ?  
                      "0" : Integer.toString(dig);  
  
       return str_cnpj.equals(cnpj_calc);  
    } 
}